package magchess10S.rn;

import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.LinkedHashMap;

import magchess10.ClassesSO.IConnClient;
import magchess10S.ClassesPE.AcessoBD;
import magchess10S.ClassesSO.IConnServidor;

/**
 * 
 * @author User
 */
public class ControleNaoJogoServidor extends UnicastRemoteObject implements
		IConnServidor, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private DescritorMesa c_descritorMesa;
	private AcessoBD c_AcessoBD;
	private int c_portaAtual = 1098;
	private final LinkedHashMap<String, IConnClient> rmiNaoJogoClientes = new LinkedHashMap<String, IConnClient>();

	public ControleNaoJogoServidor() throws RemoteException {
		super();
		c_descritorMesa = new DescritorMesa();
		c_AcessoBD = new AcessoBD();

	}

	public boolean consultarBD(String p_apelido, String p_senha)
			throws RemoteException {
		return c_AcessoBD.consultaBD(p_apelido, p_senha);
	}

	private boolean checarMesaCompleta() {
		return c_descritorMesa.checarMesaCompleta();
	}

	public boolean inserirBD(String p_apelido, String p_senha,
			String p_primeiroNome, String p_ultimoNome, String p_email)
			throws RemoteException {

		c_AcessoBD.InserirBD(p_apelido, p_senha, p_primeiroNome, p_ultimoNome,
				p_email);
		return true;
	}

	public void atualizaTempoMesa(int p_tempoJogo) throws RemoteException {
		c_descritorMesa.setTempoMesa(p_tempoJogo);
		solicitaAtualizacaoTempoTelaMesa(p_tempoJogo);
		if (checarMesaCompleta())
			SolicitarRedirecionamentoTelaJogo();
	}

	public void atualizaJogadoresMesa(int p_posicaoJogador, String p_nomeJogador)
			throws RemoteException {
		c_descritorMesa.setJogadorMesa(p_posicaoJogador, p_nomeJogador);
		solicitaAtualizacaoJogadorTelaMesa(p_nomeJogador);
		if (checarMesaCompleta() && getDescritorMesa().getTempoMesa() != 0)
			SolicitarRedirecionamentoTelaJogo();

	}

	private void solicitaAtualizacaoTempoTelaMesa(int tempoJogo) {

		for (IConnClient client : rmiNaoJogoClientes.values()) {
			try {
				client.atualizarTempoTelaMesa(tempoJogo);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}

	}

	public String[] getStatusMesa() {
		return getDescritorMesa().getJogadoresMesa();
	}

	public int getTempoMesa() {
		return getDescritorMesa().getTempoMesa();
	}

	private void SolicitarRedirecionamentoTelaJogo() {

		for (IConnClient client : rmiNaoJogoClientes.values()) {
			try {
				client.redirecionarTelaJogo(getStatusMesa(), getTempoInicial());
				new ControleJogoServidor(c_descritorMesa);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}

	}

	private void solicitaAtualizacaoJogadorTelaMesa(String p_nomeJogador) {
		for (IConnClient client : rmiNaoJogoClientes.values()) {
			try {
				client.atualizarJogadoresTelaMesa(getStatusMesa());
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}

	}

	public void registrarClienteServidor(String ipCliente, String nomeCliente) {
		try {
			rmiNaoJogoClientes.put(nomeCliente, (IConnClient) Naming
					.lookup("rmi://" + ipCliente + ":" + c_portaAtual + "/"
							+ nomeCliente));

		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

	public int getPortaAtual() {
		return c_portaAtual;
	}

	protected int getTempoInicial() {
		return getDescritorMesa().getTempoMesa();
	}

	protected DescritorMesa getDescritorMesa() {
		return c_descritorMesa;
	}

}
